package com.xukang.demo.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;

@Component
public class TokenFilter extends ZuulFilter {

    /**
     * filterType 过滤器 类型
     * pre  请求之前进行执行
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * filterOrder 过滤器执行顺序
     * 当一个请求在同一个阶段 存在多个过滤器时  多个过滤器 执行顺序
     * 0,1,2,3,4....
     * @return
     */
    @Override
    public int filterOrder() {
        return 1;
    }

    /**
     * shouldFilter 过滤器是否生效
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * run 过滤器 拦截业务逻辑代码
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {

        //案例 :拦截所有服务接口,判断 userToken 是否传递
        //1  获取上下文
        RequestContext requestContext = RequestContext.getCurrentContext();
        //2 获取request
        HttpServletRequest  request= requestContext.getRequest();
        //3 获取token
        String userToken = request.getParameter("userToken");
        if(StringUtils.isEmpty(userToken)){
            //不通过,不调用 ,网关会直接响应  客户端
            requestContext.setSendZuulResponse(false);
            // 返回错误提示
            requestContext.setResponseBody("userToken  is null");
            requestContext.setResponseStatusCode(401);
            return null;
        }
        //5 正常执行调用接口
        return null;
    }
}
